#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Status.c"
#include "Book.c"

/**  
 * 链表 
 * 优点：元素的个数可以自由扩充
 *      插入删除不必移动数据，只需修改前后指向
 * 缺点：存储密度小
 *      存取效率不高，必须采取顺序存取 （顺藤摸瓜）
 * 
 * 1、初始化
 * 2、取值
 * 3、查找
 * 4、插入
 * 5、删除
 * 6、销毁
 * 8、表长
 * 
*/


typedef struct LNode {
    Book book;  // 数据域
    struct LNode *next; // 下一个节点指针域
}LNode,*LinkList;

// 1、初始化
Status Init_LinkList(LinkList L) {
    LNode *node = (LNode *)malloc(sizeof(LNode));
    *L = *node;
    L->next = NULL;
    return OK;
}

// 求表长
int getLinkListLength(LinkList L) {
    int i = 0;
    LinkList head = L->next;
    while(head != NULL) {
        head = head->next;
        i++;
    }
    return i;
}

// 判空
int isEmpty(LinkList L) {
    return L->next?0:1;
}

// 2、取值
Status getNode(LinkList L,int i,Book *book) {
    if (i < 1 || i > getLinkListLength(L)) {
        return ERROR;
    }
    
    int j = 0;
    LNode *head = L->next;
    while(head) {
        j++;
        if (j == i)
        {
            *book = head->book;
            return OK;
        }
        head = head->next;
    }
    
    return ERROR;
}

// 3、查找
LNode *LocateNode(LinkList L,Book book) {
    LNode *head = L->next;
    while(head) {
        if (strcmp(head->next->book.no,book.no)==0) {
            return head->next;
        }
        head = head->next;
    }
}

// 4、删除
Status DeletNode(LinkList L,int i) {
    if (i < 1 || i > getLinkListLength(L)) {
        return ERROR;
    }
    int j=0;
    LNode *head = L->next;
    while(head) {
        j++;
        if (j == (i - 1)) 
        {
            LNode *tmp;
            tmp = head->next;
            head->next = head->next->next;
            free(tmp);
            return OK;
        }
        head = head->next;
    }
}

// 5、插入
Status InsertNode(LinkList L,int i,Book *book) {
    if (i < 1 || i > getLinkListLength(L)+1) {
        return ERROR;
    }
    // 找到 i-1 的节点
    int j=0;
    LNode *head = L;
    while(head && j < (i - 1)) {
        j++;
        head = head->next;
    }
    // 新建节点
    LNode *node = (LNode *)malloc(sizeof(LNode));
    node->next = NULL;
    node->book = *book;
    // node 占据 i节点 所以 node.next 是 i 即 head.next    
    node->next = head->next;
    head->next = node;
    return OK;
}




int main () {
    LinkList list;
    // list->next = NULL;
    Book b1 = {"200","政治",5};
    Book b2 = {"202","地理",6};
    Init_LinkList(list);

    InsertNode(list,1,&b1);
    InsertNode(list,2,&b2);
    int l = getLinkListLength(list);
    for (int i = 1; i <= l; i++)
    {
        Book book;
        getNode(list,i,&book);
        printf("%d no=%s,name=%s,price=%2f\n",i,book.no,book.name,book.price);
    }
    printf("%d\n",getLinkListLength(list));
    

    return 0;
}
